Creating a simple model based on Gender


In [ ]:
""" This simple code is desinged to teach a basic user to read in the files in python, simply find what proportion of males and females survived and make a predictive model based on this
Author : AstroDave
Date : 18 September 2012
Revised: 28 March 2014

"""

In [1]:
import csv as csv
import numpy as np

Load training data


In [2]:
csv_file_object = csv.reader(open('./data/train.csv', 'rb')) 	# Load in the csv file
header          = csv_file_object.next() 						# Skip the fist line as it is a header
data            =[] 											# Create a variable to hold the data

In [4]:
for row in csv_file_object: 							# Skip through each row in the csv file,
    data.append(row[0:]) 								# adding each row to the data variable
data = np.array(data) 									# Then convert from a list to an array.

Take a look at the training data


In [7]:
type(data)


Out[7]:
numpy.ndarray

In [8]:
data.shape


Out[8]:
(891, 12)

In [9]:
data


Out[9]:
array([['1', '0', '3', ..., '7.25', '', 'S'],
       ['2', '1', '1', ..., '71.2833', 'C85', 'C'],
       ['3', '1', '3', ..., '7.925', '', 'S'],
       ..., 
       ['889', '0', '3', ..., '23.45', '', 'S'],
       ['890', '1', '1', ..., '30', 'C148', 'C'],
       ['891', '0', '3', ..., '7.75', '', 'Q']], 
      dtype='|S82')

Playing w/ the data

I have an array of 12 columns and 891 rows. I can access any element I want, so the entire first column would be data[0::,0].astype(np.float) -- This means all of the rows (from start to end), in column 0 I have to add the .astype() command, because when appending the rows, python thought it was a string - so needed to convert


In [11]:
data[0::,0].astype(np.float)


Out[11]:
array([   1.,    2.,    3.,    4.,    5.,    6.,    7.,    8.,    9.,
         10.,   11.,   12.,   13.,   14.,   15.,   16.,   17.,   18.,
         19.,   20.,   21.,   22.,   23.,   24.,   25.,   26.,   27.,
         28.,   29.,   30.,   31.,   32.,   33.,   34.,   35.,   36.,
         37.,   38.,   39.,   40.,   41.,   42.,   43.,   44.,   45.,
         46.,   47.,   48.,   49.,   50.,   51.,   52.,   53.,   54.,
         55.,   56.,   57.,   58.,   59.,   60.,   61.,   62.,   63.,
         64.,   65.,   66.,   67.,   68.,   69.,   70.,   71.,   72.,
         73.,   74.,   75.,   76.,   77.,   78.,   79.,   80.,   81.,
         82.,   83.,   84.,   85.,   86.,   87.,   88.,   89.,   90.,
         91.,   92.,   93.,   94.,   95.,   96.,   97.,   98.,   99.,
        100.,  101.,  102.,  103.,  104.,  105.,  106.,  107.,  108.,
        109.,  110.,  111.,  112.,  113.,  114.,  115.,  116.,  117.,
        118.,  119.,  120.,  121.,  122.,  123.,  124.,  125.,  126.,
        127.,  128.,  129.,  130.,  131.,  132.,  133.,  134.,  135.,
        136.,  137.,  138.,  139.,  140.,  141.,  142.,  143.,  144.,
        145.,  146.,  147.,  148.,  149.,  150.,  151.,  152.,  153.,
        154.,  155.,  156.,  157.,  158.,  159.,  160.,  161.,  162.,
        163.,  164.,  165.,  166.,  167.,  168.,  169.,  170.,  171.,
        172.,  173.,  174.,  175.,  176.,  177.,  178.,  179.,  180.,
        181.,  182.,  183.,  184.,  185.,  186.,  187.,  188.,  189.,
        190.,  191.,  192.,  193.,  194.,  195.,  196.,  197.,  198.,
        199.,  200.,  201.,  202.,  203.,  204.,  205.,  206.,  207.,
        208.,  209.,  210.,  211.,  212.,  213.,  214.,  215.,  216.,
        217.,  218.,  219.,  220.,  221.,  222.,  223.,  224.,  225.,
        226.,  227.,  228.,  229.,  230.,  231.,  232.,  233.,  234.,
        235.,  236.,  237.,  238.,  239.,  240.,  241.,  242.,  243.,
        244.,  245.,  246.,  247.,  248.,  249.,  250.,  251.,  252.,
        253.,  254.,  255.,  256.,  257.,  258.,  259.,  260.,  261.,
        262.,  263.,  264.,  265.,  266.,  267.,  268.,  269.,  270.,
        271.,  272.,  273.,  274.,  275.,  276.,  277.,  278.,  279.,
        280.,  281.,  282.,  283.,  284.,  285.,  286.,  287.,  288.,
        289.,  290.,  291.,  292.,  293.,  294.,  295.,  296.,  297.,
        298.,  299.,  300.,  301.,  302.,  303.,  304.,  305.,  306.,
        307.,  308.,  309.,  310.,  311.,  312.,  313.,  314.,  315.,
        316.,  317.,  318.,  319.,  320.,  321.,  322.,  323.,  324.,
        325.,  326.,  327.,  328.,  329.,  330.,  331.,  332.,  333.,
        334.,  335.,  336.,  337.,  338.,  339.,  340.,  341.,  342.,
        343.,  344.,  345.,  346.,  347.,  348.,  349.,  350.,  351.,
        352.,  353.,  354.,  355.,  356.,  357.,  358.,  359.,  360.,
        361.,  362.,  363.,  364.,  365.,  366.,  367.,  368.,  369.,
        370.,  371.,  372.,  373.,  374.,  375.,  376.,  377.,  378.,
        379.,  380.,  381.,  382.,  383.,  384.,  385.,  386.,  387.,
        388.,  389.,  390.,  391.,  392.,  393.,  394.,  395.,  396.,
        397.,  398.,  399.,  400.,  401.,  402.,  403.,  404.,  405.,
        406.,  407.,  408.,  409.,  410.,  411.,  412.,  413.,  414.,
        415.,  416.,  417.,  418.,  419.,  420.,  421.,  422.,  423.,
        424.,  425.,  426.,  427.,  428.,  429.,  430.,  431.,  432.,
        433.,  434.,  435.,  436.,  437.,  438.,  439.,  440.,  441.,
        442.,  443.,  444.,  445.,  446.,  447.,  448.,  449.,  450.,
        451.,  452.,  453.,  454.,  455.,  456.,  457.,  458.,  459.,
        460.,  461.,  462.,  463.,  464.,  465.,  466.,  467.,  468.,
        469.,  470.,  471.,  472.,  473.,  474.,  475.,  476.,  477.,
        478.,  479.,  480.,  481.,  482.,  483.,  484.,  485.,  486.,
        487.,  488.,  489.,  490.,  491.,  492.,  493.,  494.,  495.,
        496.,  497.,  498.,  499.,  500.,  501.,  502.,  503.,  504.,
        505.,  506.,  507.,  508.,  509.,  510.,  511.,  512.,  513.,
        514.,  515.,  516.,  517.,  518.,  519.,  520.,  521.,  522.,
        523.,  524.,  525.,  526.,  527.,  528.,  529.,  530.,  531.,
        532.,  533.,  534.,  535.,  536.,  537.,  538.,  539.,  540.,
        541.,  542.,  543.,  544.,  545.,  546.,  547.,  548.,  549.,
        550.,  551.,  552.,  553.,  554.,  555.,  556.,  557.,  558.,
        559.,  560.,  561.,  562.,  563.,  564.,  565.,  566.,  567.,
        568.,  569.,  570.,  571.,  572.,  573.,  574.,  575.,  576.,
        577.,  578.,  579.,  580.,  581.,  582.,  583.,  584.,  585.,
        586.,  587.,  588.,  589.,  590.,  591.,  592.,  593.,  594.,
        595.,  596.,  597.,  598.,  599.,  600.,  601.,  602.,  603.,
        604.,  605.,  606.,  607.,  608.,  609.,  610.,  611.,  612.,
        613.,  614.,  615.,  616.,  617.,  618.,  619.,  620.,  621.,
        622.,  623.,  624.,  625.,  626.,  627.,  628.,  629.,  630.,
        631.,  632.,  633.,  634.,  635.,  636.,  637.,  638.,  639.,
        640.,  641.,  642.,  643.,  644.,  645.,  646.,  647.,  648.,
        649.,  650.,  651.,  652.,  653.,  654.,  655.,  656.,  657.,
        658.,  659.,  660.,  661.,  662.,  663.,  664.,  665.,  666.,
        667.,  668.,  669.,  670.,  671.,  672.,  673.,  674.,  675.,
        676.,  677.,  678.,  679.,  680.,  681.,  682.,  683.,  684.,
        685.,  686.,  687.,  688.,  689.,  690.,  691.,  692.,  693.,
        694.,  695.,  696.,  697.,  698.,  699.,  700.,  701.,  702.,
        703.,  704.,  705.,  706.,  707.,  708.,  709.,  710.,  711.,
        712.,  713.,  714.,  715.,  716.,  717.,  718.,  719.,  720.,
        721.,  722.,  723.,  724.,  725.,  726.,  727.,  728.,  729.,
        730.,  731.,  732.,  733.,  734.,  735.,  736.,  737.,  738.,
        739.,  740.,  741.,  742.,  743.,  744.,  745.,  746.,  747.,
        748.,  749.,  750.,  751.,  752.,  753.,  754.,  755.,  756.,
        757.,  758.,  759.,  760.,  761.,  762.,  763.,  764.,  765.,
        766.,  767.,  768.,  769.,  770.,  771.,  772.,  773.,  774.,
        775.,  776.,  777.,  778.,  779.,  780.,  781.,  782.,  783.,
        784.,  785.,  786.,  787.,  788.,  789.,  790.,  791.,  792.,
        793.,  794.,  795.,  796.,  797.,  798.,  799.,  800.,  801.,
        802.,  803.,  804.,  805.,  806.,  807.,  808.,  809.,  810.,
        811.,  812.,  813.,  814.,  815.,  816.,  817.,  818.,  819.,
        820.,  821.,  822.,  823.,  824.,  825.,  826.,  827.,  828.,
        829.,  830.,  831.,  832.,  833.,  834.,  835.,  836.,  837.,
        838.,  839.,  840.,  841.,  842.,  843.,  844.,  845.,  846.,
        847.,  848.,  849.,  850.,  851.,  852.,  853.,  854.,  855.,
        856.,  857.,  858.,  859.,  860.,  861.,  862.,  863.,  864.,
        865.,  866.,  867.,  868.,  869.,  870.,  871.,  872.,  873.,
        874.,  875.,  876.,  877.,  878.,  879.,  880.,  881.,  882.,
        883.,  884.,  885.,  886.,  887.,  888.,  889.,  890.,  891.])

Proportion of Survivors


In [31]:
number_passengers    = np.size(data[0::,1].astype(np.float))
number_survived      = np.sum(data[0::,1].astype(np.float))
proportion_survivors = number_survived / number_passengers
print 'Proportion of Survivors: %s/%s = %s' % (number_passengers \
                                               , number_survived \
                                               , proportion_survivors)


Proportion of Survivors: 891/342.0 = 0.383838383838

Stats of all women on board

Find the stats of all the women on board, by making an array that lists True/False whether each row is female


In [20]:
women_only_stats = data[0::,4] == "female" 	# This finds where all the women are
men_only_stats   = data[0::,4] != "female" 	# This finds where all the men are (note != means 'not equal')

Filter the whole data, to find statistics for just women, by just placing women_only_stats as a "mask" on my full data -- Use it in place of the '0::' part of the array index.

You can test it by placing it there, and requesting column index [4], and the output should all read 'female' e.g. try typing this: data[women_only_stats,4]


In [35]:
women_onboard = data[women_only_stats, 1].astype(np.float)
men_onboard   = data[men_only_stats,   1].astype(np.float)

In [36]:
print 'Women onboard: %s' % women_onboard.size
print 'Men   onboard: %s' % men_onboard.size
print 'Total onboard: %s' % (women_onboard.size+men_onboard.size)


Women onboard: 314
Men   onboard: 577
Total onboard: 891

Derive some statistics about them


In [37]:
proportion_women_survived = np.sum(women_onboard) / np.size(women_onboard)
proportion_men_survived   = np.sum(men_onboard)   / np.size(men_onboard)

In [28]:
print 'Proportion of women who survived is %s' % proportion_women_survived
print 'Proportion of men   who survived is %s' % proportion_men_survived


Proportion of women who survived is 0.742038216561
Proportion of men   who survived is 0.188908145581

Now that I have my indicator that women were much more likely to survive, I am done with the training set.

First Basic Model: Women Survive

Let's read in the test file and write out a simple prediction:

  • if female, then model that she survived (1)
  • if male, then model that he did not survive (0)

In [54]:
test_file        = open('./data/test.csv', 'rb')         # First, read in test.csv
test_file_object = csv.reader(test_file)
header           = test_file_object.next()

In [55]:
header


Out[55]:
['PassengerId',
 'Pclass',
 'Name',
 'Sex',
 'Age',
 'SibSp',
 'Parch',
 'Ticket',
 'Fare',
 'Cabin',
 'Embarked']

Open a new file so I can write to it.

Call it something descriptive. Finally, loop through each row in the train file, and look in column index [3] (which is 'Sex'). Write out the PassengerId, and my prediction.


In [57]:
predictions_file        = open("./models/jfaPythonBasicGenderModel.csv", "wb")
predictions_file_object = csv.writer(predictions_file)
predictions_file_object.writerow(["PassengerId", "Survived"])	# write the column headers

Model algorithm: Females survive, Males die

Loop through each passenger in the train file:

  • if passenger is female, set as survived
  • if passenger is male, set as died

In [58]:
for row in test_file_object:									# For each row in test file,
    if row[3] == 'female':										# is it a female, if yes then
        predictions_file_object.writerow([row[0], "1"])			# write the PassengerId, and predict 1
    else:														# or else if male,
        predictions_file_object.writerow([row[0], "0"])			# write the PassengerId, and predict 0.

In [59]:
test_file.close()												# Close out the files.
predictions_file.close()

In [ ]:


In [ ]: